package com.gotrade.demo;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.concurrent.EventExecutorGroup;

import javax.swing.*;
import java.nio.charset.Charset;
import java.util.Date;

/**
 * @author jason.tang
 * @create 2018-12-04 11:59
 * @description
 *  总结：
 *      1. 逻辑处理器继承ChannelInboundHandlerAdapter
 *      2. channelActive方法会在客户端连接成功之后调用
 *      3. Netty里面的数据是以ByteBuf为单位，所有写出的数据都必须塞到一个ByteBuf，读如此，写亦如此
 */
public class FirstClientHandler extends ChannelInboundHandlerAdapter {

    /**
     * 客户端读取数据，与服务端同理
     * @param ctx
     * @param msg
     * @throws Exception
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        ByteBuf byteBuf = (ByteBuf) msg;
        System.out.println(new Date() + ": 客户端读到数据 -> " + byteBuf.toString(Charset.forName("utf-8")));
    }

    /**
     * channelActive这个方法会在客户端连接成功之后调用
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        System.out.println("客户端写出数据");

        // 1. 获取数据
        ByteBuf buffer = getByteBuf(ctx);

        // 将数据写到服务端
        ctx.channel().writeAndFlush(buffer);
    }

    private ByteBuf getByteBuf(ChannelHandlerContext ctx) {
        // 1. 获取二进制抽象ByteBuf（先获得内存管理器）
        ByteBuf buffer = ctx.alloc().buffer();

        // 2. 准备数据，指定字符串的字符集为utf-8
        byte[] bytes = "hello, netty server".getBytes(Charset.forName("utf-8"));

        // 3. 将二进制数据填充到ByteBuf
        buffer.writeBytes(bytes);

        return buffer;
    }
}